home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / e / cha_source.lha / cha_source / cbuffer.e < prev    next >
Encoding:
Text File  |  1999-12-18  |  1.9 KB  |  70 lines

  1. /*==========================================================================+
  2. | cbuffer.e                                                                 |
  3. | circular buffer for storing past data                                     |
  4. +--------------------------------------------------------------------------*/
  5.  
  6. OPT MODULE
  7. OPT PREPROCESS
  8.  
  9. MODULE '*debug'
  10.  
  11. RAISE "MEM" IF New() = NIL
  12.  
  13. /*-------------------------------------------------------------------------*/
  14.  
  15. CONST CBUFFER_SPACE = 1
  16.  
  17. EXPORT OBJECT cbuffer
  18.     length : LONG
  19. PRIVATE
  20.     rptr   : LONG
  21.     wptr   : LONG
  22.     data   : PTR TO LONG
  23. ENDOBJECT
  24.  
  25. PROC cbuffer(length : LONG) OF cbuffer
  26. ->    debug(['cbuffer.cbuffer(\d)', length])
  27.     self.length := length
  28.     self.rptr := 0
  29.     self.wptr := length -> - 1
  30.     self.data := New(Mul(length + CBUFFER_SPACE, SIZEOF LONG))
  31. ENDPROC
  32.  
  33. PROC end() OF cbuffer
  34. ->    debug(['cbuffer.end()'])
  35.     Dispose(self.data)
  36. ENDPROC
  37.  
  38. PROC read(offset=0) OF cbuffer  -> -length < offset <= 0
  39.     DEF r
  40.     r := self.rptr + offset
  41.     IF r < 0 THEN r := r + self.length + CBUFFER_SPACE
  42. ->    debug(['cbuffer.read(\d), r=\d', offset, r])
  43. ENDPROC self.data[r]
  44.  
  45. PROC write(x : LONG) OF cbuffer
  46. ->    debug(['cbuffer.write(\d)', x])
  47.     self.data[self.wptr] := x
  48. ENDPROC
  49.  
  50. PROC next() OF cbuffer
  51. #ifdef DEBUG
  52.     DEF i
  53. #endif
  54. ->    debug(['cbuffer.next(), r=\d w=\d', self.rptr, self.wptr])
  55.     self.rptr := self.rptr + 1
  56.     self.wptr := self.wptr + 1
  57.     IF self.rptr >= (self.length + CBUFFER_SPACE) THEN self.rptr := 0
  58.     IF self.wptr >= (self.length + CBUFFER_SPACE) THEN self.wptr := 0
  59. ->    debug(['                r=\d w=\d', self.rptr, self.wptr])
  60. #ifdef DEBUG
  61.     WriteF('cbuffer: ')
  62.     FOR i := 0 TO self.length - 1 DO WriteF('\s ', float2string(self.read(-i)))
  63.     WriteF('...\n')
  64. #endif
  65. ENDPROC
  66.  
  67. /*--------------------------------------------------------------------------+
  68. | END: cbuffer.e                                                            |
  69. +==========================================================================*/
  70.